1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package sun.security.ssl;
28
29 import java.util.*;
30
31 import java.security.NoSuchAlgorithmException;
32 import java.security.InvalidKeyException;
33 import java.security.SecureRandom;
34
35 import javax.crypto.SecretKey;
36 import javax.crypto.spec.IvParameterSpec;
37 import javax.crypto.spec.SecretKeySpec;
38
39 import sun.security.ssl.CipherSuite.*;
40 import static sun.security.ssl.CipherSuite.KeyExchange.*;
41 import static sun.security.ssl.CipherSuite.PRF.*;
42 import static sun.security.ssl.JsseJce.*;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 final class CipherSuite implements Comparable {
69
70
71 final static int SUPPORTED_SUITES_PRIORITY = 1;
72
73
74 final static int DEFAULT_SUITES_PRIORITY = 300;
75
76
77
78
79
80 final static boolean DYNAMIC_AVAILABILITY = true;
81
82 private final static boolean ALLOW_ECC = Debug.getBooleanProperty
83 ("com.sun.net.ssl.enableECC", true);
84
85
86
87 private final static Map<Integer,CipherSuite> idMap;
88
89
90
91 private final static Map<String,CipherSuite> nameMap;
92
93
94
95 final String name;
96
97
98 final int id;
99
100
101
102
103
104 final int priority;
105
106
107
108 final KeyExchange keyExchange;
109 final BulkCipher cipher;
110 final MacAlg macAlg;
111 final PRF prfAlg;
112
113
114
115 final boolean exportable;
116
117
118 final boolean allowed;
119
120
121 final int obsoleted;
122
123
124 final int supported;
125
126
127
128
129 private CipherSuite(String name, int id, int priority,
130 KeyExchange keyExchange, BulkCipher cipher,
131 boolean allowed, int obsoleted, int supported, PRF prfAlg) {
132 this.name = name;
133 this.id = id;
134 this.priority = priority;
135 this.keyExchange = keyExchange;
136 this.cipher = cipher;
137 this.exportable = cipher.exportable;
138 if (name.endsWith("_MD5")) {
139 macAlg = M_MD5;
140 } else if (name.endsWith("_SHA")) {
141 macAlg = M_SHA;
142 } else if (name.endsWith("_SHA256")) {
143 macAlg = M_SHA256;
144 } else if (name.endsWith("_SHA384")) {
145 macAlg = M_SHA384;
146 } else if (name.endsWith("_NULL")) {
147 macAlg = M_NULL;
148 } else if (name.endsWith("_SCSV")) {
149 macAlg = M_NULL;
150 } else {
151 throw new IllegalArgumentException
152 ("Unknown MAC algorithm for ciphersuite " + name);
153 }
154
155 allowed &= keyExchange.allowed;
156 allowed &= cipher.allowed;
157 this.allowed = allowed;
158 this.obsoleted = obsoleted;
159 this.supported = supported;
160 this.prfAlg = prfAlg;
161 }
162
163
164
165
166 private CipherSuite(String name, int id) {
167 this.name = name;
168 this.id = id;
169 this.allowed = false;
170
171 this.priority = 0;
172 this.keyExchange = null;
173 this.cipher = null;
174 this.macAlg = null;
175 this.exportable = false;
176 this.obsoleted = ProtocolVersion.LIMIT_MAX_VALUE;
177 this.supported = ProtocolVersion.LIMIT_MIN_VALUE;
178 this.prfAlg = P_NONE;
179 }
180
181
182
183
184
185
186
187
188
189 boolean isAvailable() {
190 return allowed && keyExchange.isAvailable() && cipher.isAvailable();
191 }
192
193 boolean isNegotiable() {
194 return this != C_SCSV && isAvailable();
195 }
196
197
198
199
200
201
202
203
204
205 public int compareTo(Object o) {
206 return ((CipherSuite)o).priority - priority;
207 }
208
209
210
211
212 public String toString() {
213 return name;
214 }
215
216
217
218
219
220
221
222
223
224 static CipherSuite valueOf(String s) {
225 if (s == null) {
226 throw new IllegalArgumentException("Name must not be null");
227 }
228
229 CipherSuite c = nameMap.get(s);
230 if ((c == null) || (c.allowed == false)) {
231 throw new IllegalArgumentException("Unsupported ciphersuite " + s);
232 }
233
234 return c;
235 }
236
237
238
239
240
241
242 static CipherSuite valueOf(int id1, int id2) {
243 id1 &= 0xff;
244 id2 &= 0xff;
245 int id = (id1 << 8) | id2;
246 CipherSuite c = idMap.get(id);
247 if (c == null) {
248 String h1 = Integer.toString(id1, 16);
249 String h2 = Integer.toString(id2, 16);
250 c = new CipherSuite("Unknown 0x" + h1 + ":0x" + h2, id);
251 }
252 return c;
253 }
254
255
256 static Collection<CipherSuite> allowedCipherSuites() {
257 return nameMap.values();
258 }
259
260
261
262
263
264
265 private static void add(String name, int id, int priority,
266 KeyExchange keyExchange, BulkCipher cipher,
267 boolean allowed, int obsoleted, int supported, PRF prf) {
268
269 CipherSuite c = new CipherSuite(name, id, priority, keyExchange,
270 cipher, allowed, obsoleted, supported, prf);
271 if (idMap.put(id, c) != null) {
272 throw new RuntimeException("Duplicate ciphersuite definition: "
273 + id + ", " + name);
274 }
275 if (c.allowed) {
276 if (nameMap.put(name, c) != null) {
277 throw new RuntimeException("Duplicate ciphersuite definition: "
278 + id + ", " + name);
279 }
280 }
281 }
282
283
284
285
286
287
288
289
290 private static void add(String name, int id, int priority,
291 KeyExchange keyExchange, BulkCipher cipher,
292 boolean allowed, int obsoleted) {
293
294
295 PRF prf = P_SHA256;
296 if (obsoleted < ProtocolVersion.TLS12.v) {
297 prf = P_NONE;
298 }
299
300 add(name, id, priority, keyExchange, cipher, allowed, obsoleted,
301 ProtocolVersion.LIMIT_MIN_VALUE, prf);
302 }
303
304
305
306
307
308 private static void add(String name, int id, int priority,
309 KeyExchange keyExchange, BulkCipher cipher, boolean allowed) {
310 add(name, id, priority, keyExchange,
311 cipher, allowed, ProtocolVersion.LIMIT_MAX_VALUE);
312 }
313
314
315
316
317
318 private static void add(String name, int id) {
319 CipherSuite c = new CipherSuite(name, id);
320 if (idMap.put(id, c) != null) {
321 throw new RuntimeException("Duplicate ciphersuite definition: "
322 + id + ", " + name);
323 }
324 }
325
326
327
328
329 static enum KeyExchange {
330
331
332 K_NULL ("NULL", false),
333 K_RSA ("RSA", true),
334 K_RSA_EXPORT ("RSA_EXPORT", true),
335 K_DH_RSA ("DH_RSA", false),
336 K_DH_DSS ("DH_DSS", false),
337 K_DHE_DSS ("DHE_DSS", true),
338 K_DHE_RSA ("DHE_RSA", true),
339 K_DH_ANON ("DH_anon", true),
340
341 K_ECDH_ECDSA ("ECDH_ECDSA", ALLOW_ECC),
342 K_ECDH_RSA ("ECDH_RSA", ALLOW_ECC),
343 K_ECDHE_ECDSA("ECDHE_ECDSA", ALLOW_ECC),
344 K_ECDHE_RSA ("ECDHE_RSA", ALLOW_ECC),
345 K_ECDH_ANON ("ECDH_anon", ALLOW_ECC),
346
347
348 K_KRB5 ("KRB5", true),
349 K_KRB5_EXPORT("KRB5_EXPORT", true),
350
351
352 K_SCSV ("SCSV", true);
353
354
355 final String name;
356 final boolean allowed;
357 private final boolean alwaysAvailable;
358
359 KeyExchange(String name, boolean allowed) {
360 this.name = name;
361 this.allowed = allowed;
362 this.alwaysAvailable = allowed &&
363 (!name.startsWith("EC")) && (!name.startsWith("KRB"));
364 }
365
366 boolean isAvailable() {
367 if (alwaysAvailable) {
368 return true;
369 }
370
371 if (name.startsWith("EC")) {
372 return (allowed && JsseJce.isEcAvailable());
373 } else if (name.startsWith("KRB")) {
374 return (allowed && JsseJce.isKerberosAvailable());
375 } else {
376 return allowed;
377 }
378 }
379
380 public String toString() {
381 return name;
382 }
383 }
384
385
386
387
388
389
390
391
392 final static class BulkCipher {
393
394
395 private final static Map<BulkCipher,Boolean> availableCache =
396 new HashMap<>(8);
397
398
399 final String description;
400
401
402 final String transformation;
403
404
405 final String algorithm;
406
407
408 final boolean allowed;
409
410
411 final int keySize;
412
413
414
415 final int expandedKeySize;
416
417
418 final int ivSize;
419
420
421 final boolean exportable;
422
423 BulkCipher(String transformation, int keySize,
424 int expandedKeySize, int ivSize, boolean allowed) {
425 this.transformation = transformation;
426 this.algorithm = transformation.split("/")[0];
427 this.description = this.algorithm + "/" + (keySize << 3);
428 this.keySize = keySize;
429 this.ivSize = ivSize;
430 this.allowed = allowed;
431
432 this.expandedKeySize = expandedKeySize;
433 this.exportable = true;
434 }
435
436 BulkCipher(String transformation, int keySize,
437 int ivSize, boolean allowed) {
438 this.transformation = transformation;
439 this.algorithm = transformation.split("/")[0];
440 this.description = this.algorithm + "/" + (keySize << 3);
441 this.keySize = keySize;
442 this.ivSize = ivSize;
443 this.allowed = allowed;
444
445 this.expandedKeySize = keySize;
446 this.exportable = false;
447 }
448
449
450
451
452
453
454
455 CipherBox newCipher(ProtocolVersion version, SecretKey key,
456 IvParameterSpec iv, SecureRandom random,
457 boolean encrypt) throws NoSuchAlgorithmException {
458 return CipherBox.newCipherBox(version, this,
459 key, iv, random, encrypt);
460 }
461
462
463
464
465
466
467
468
469
470
471 boolean isAvailable() {
472 if (allowed == false) {
473 return false;
474 }
475 if (this == B_AES_256) {
476 return isAvailable(this);
477 }
478
479
480 return true;
481 }
482
483
484 static synchronized void clearAvailableCache() {
485 if (DYNAMIC_AVAILABILITY) {
486 availableCache.clear();
487 }
488 }
489
490 private static synchronized boolean isAvailable(BulkCipher cipher) {
491 Boolean b = availableCache.get(cipher);
492 if (b == null) {
493 try {
494 SecretKey key = new SecretKeySpec
495 (new byte[cipher.expandedKeySize], cipher.algorithm);
496 IvParameterSpec iv =
497 new IvParameterSpec(new byte[cipher.ivSize]);
498 cipher.newCipher(ProtocolVersion.DEFAULT,
499 key, iv, null, true);
500 b = Boolean.TRUE;
501 } catch (NoSuchAlgorithmException e) {
502 b = Boolean.FALSE;
503 }
504 availableCache.put(cipher, b);
505 }
506 return b.booleanValue();
507 }
508
509 public String toString() {
510 return description;
511 }
512 }
513
514
515
516
517
518
519
520 final static class MacAlg {
521
522
523 final String name;
524
525
526 final int size;
527
528 MacAlg(String name, int size) {
529 this.name = name;
530 this.size = size;
531 }
532
533
534
535
536
537
538
539 MAC newMac(ProtocolVersion protocolVersion, SecretKey secret)
540 throws NoSuchAlgorithmException, InvalidKeyException {
541 return new MAC(this, protocolVersion, secret);
542 }
543
544 public String toString() {
545 return name;
546 }
547 }
548
549
550 final static BulkCipher B_NULL =
551 new BulkCipher("NULL", 0, 0, 0, true);
552 final static BulkCipher B_RC4_40 =
553 new BulkCipher(CIPHER_RC4, 5, 16, 0, true);
554 final static BulkCipher B_RC2_40 =
555 new BulkCipher("RC2", 5, 16, 8, false);
556 final static BulkCipher B_DES_40 =
557 new BulkCipher(CIPHER_DES, 5, 8, 8, true);
558
559
560 final static BulkCipher B_RC4_128 =
561 new BulkCipher(CIPHER_RC4, 16, 0, true);
562 final static BulkCipher B_DES =
563 new BulkCipher(CIPHER_DES, 8, 8, true);
564 final static BulkCipher B_3DES =
565 new BulkCipher(CIPHER_3DES, 24, 8, true);
566 final static BulkCipher B_IDEA =
567 new BulkCipher("IDEA", 16, 8, false);
568 final static BulkCipher B_AES_128 =
569 new BulkCipher(CIPHER_AES, 16, 16, true);
570 final static BulkCipher B_AES_256 =
571 new BulkCipher(CIPHER_AES, 32, 16, true);
572
573
574 final static MacAlg M_NULL = new MacAlg("NULL", 0);
575 final static MacAlg M_MD5 = new MacAlg("MD5", 16);
576 final static MacAlg M_SHA = new MacAlg("SHA", 20);
577 final static MacAlg M_SHA256 = new MacAlg("SHA256", 32);
578 final static MacAlg M_SHA384 = new MacAlg("SHA384", 48);
579
580
581
582
583
584
585
586
587
588
589
590 static enum PRF {
591
592
593 P_NONE( "NONE", 0, 0),
594 P_SHA256("SHA-256", 32, 64),
595 P_SHA384("SHA-384", 48, 128),
596 P_SHA512("SHA-512", 64, 128);
597
598
599 private final String prfHashAlg;
600 private final int prfHashLength;
601 private final int prfBlockSize;
602
603 PRF(String prfHashAlg, int prfHashLength, int prfBlockSize) {
604 this.prfHashAlg = prfHashAlg;
605 this.prfHashLength = prfHashLength;
606 this.prfBlockSize = prfBlockSize;
607 }
608
609 String getPRFHashAlg() {
610 return prfHashAlg;
611 }
612
613 int getPRFHashLength() {
614 return prfHashLength;
615 }
616
617 int getPRFBlockSize() {
618 return prfBlockSize;
619 }
620 }
621
622 static {
623 idMap = new HashMap<Integer,CipherSuite>();
624 nameMap = new HashMap<String,CipherSuite>();
625
626 final boolean F = false;
627 final boolean T = true;
628
629 final boolean N = (SunJSSE.isFIPS() == false);
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864 add("SSL_NULL_WITH_NULL_NULL",
865 0x0000, 1, K_NULL, B_NULL, F);
866
867
868
869
870
871
872
873
874
875
876
877
878
879 int p = DEFAULT_SUITES_PRIORITY * 2;
880
881
882 int max = ProtocolVersion.LIMIT_MAX_VALUE;
883 int tls11 = ProtocolVersion.TLS11.v;
884 int tls12 = ProtocolVersion.TLS12.v;
885
886
887
888 add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
889 0xc024, --p, K_ECDHE_ECDSA, B_AES_256, T, max, tls12, P_SHA384);
890 add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
891 0xc028, --p, K_ECDHE_RSA, B_AES_256, T, max, tls12, P_SHA384);
892 add("TLS_RSA_WITH_AES_256_CBC_SHA256",
893 0x003d, --p, K_RSA, B_AES_256, T, max, tls12, P_SHA256);
894 add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
895 0xc026, --p, K_ECDH_ECDSA, B_AES_256, T, max, tls12, P_SHA384);
896 add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
897 0xc02a, --p, K_ECDH_RSA, B_AES_256, T, max, tls12, P_SHA384);
898 add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
899 0x006b, --p, K_DHE_RSA, B_AES_256, T, max, tls12, P_SHA256);
900 add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
901 0x006a, --p, K_DHE_DSS, B_AES_256, T, max, tls12, P_SHA256);
902
903 add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
904 0xC00A, --p, K_ECDHE_ECDSA, B_AES_256, T);
905 add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
906 0xC014, --p, K_ECDHE_RSA, B_AES_256, T);
907 add("TLS_RSA_WITH_AES_256_CBC_SHA",
908 0x0035, --p, K_RSA, B_AES_256, T);
909 add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
910 0xC005, --p, K_ECDH_ECDSA, B_AES_256, T);
911 add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
912 0xC00F, --p, K_ECDH_RSA, B_AES_256, T);
913 add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
914 0x0039, --p, K_DHE_RSA, B_AES_256, T);
915 add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
916 0x0038, --p, K_DHE_DSS, B_AES_256, T);
917
918 add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
919 0xc023, --p, K_ECDHE_ECDSA, B_AES_128, T, max, tls12, P_SHA256);
920 add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
921 0xc027, --p, K_ECDHE_RSA, B_AES_128, T, max, tls12, P_SHA256);
922 add("TLS_RSA_WITH_AES_128_CBC_SHA256",
923 0x003c, --p, K_RSA, B_AES_128, T, max, tls12, P_SHA256);
924 add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
925 0xc025, --p, K_ECDH_ECDSA, B_AES_128, T, max, tls12, P_SHA256);
926 add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
927 0xc029, --p, K_ECDH_RSA, B_AES_128, T, max, tls12, P_SHA256);
928 add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
929 0x0067, --p, K_DHE_RSA, B_AES_128, T, max, tls12, P_SHA256);
930 add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
931 0x0040, --p, K_DHE_DSS, B_AES_128, T, max, tls12, P_SHA256);
932
933 add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
934 0xC009, --p, K_ECDHE_ECDSA, B_AES_128, T);
935 add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
936 0xC013, --p, K_ECDHE_RSA, B_AES_128, T);
937 add("TLS_RSA_WITH_AES_128_CBC_SHA",
938 0x002f, --p, K_RSA, B_AES_128, T);
939 add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
940 0xC004, --p, K_ECDH_ECDSA, B_AES_128, T);
941 add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
942 0xC00E, --p, K_ECDH_RSA, B_AES_128, T);
943 add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
944 0x0033, --p, K_DHE_RSA, B_AES_128, T);
945 add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
946 0x0032, --p, K_DHE_DSS, B_AES_128, T);
947
948 add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
949 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N);
950 add("TLS_ECDHE_RSA_WITH_RC4_128_SHA",
951 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N);
952 add("SSL_RSA_WITH_RC4_128_SHA",
953 0x0005, --p, K_RSA, B_RC4_128, N);
954 add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
955 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N);
956 add("TLS_ECDH_RSA_WITH_RC4_128_SHA",
957 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N);
958
959 add("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
960 0xC008, --p, K_ECDHE_ECDSA, B_3DES, T);
961 add("TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
962 0xC012, --p, K_ECDHE_RSA, B_3DES, T);
963 add("SSL_RSA_WITH_3DES_EDE_CBC_SHA",
964 0x000a, --p, K_RSA, B_3DES, T);
965 add("TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
966 0xC003, --p, K_ECDH_ECDSA, B_3DES, T);
967 add("TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
968 0xC00D, --p, K_ECDH_RSA, B_3DES, T);
969 add("SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
970 0x0016, --p, K_DHE_RSA, B_3DES, T);
971 add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
972 0x0013, --p, K_DHE_DSS, B_3DES, N);
973
974 add("SSL_RSA_WITH_RC4_128_MD5",
975 0x0004, --p, K_RSA, B_RC4_128, N);
976
977
978 add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV",
979 0x00ff, --p, K_SCSV, B_NULL, T);
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000 p = DEFAULT_SUITES_PRIORITY;
1001
1002 add("TLS_DH_anon_WITH_AES_256_CBC_SHA256",
1003 0x006d, --p, K_DH_ANON, B_AES_256, N, max, tls12, P_SHA256);
1004 add("TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
1005 0xC019, --p, K_ECDH_ANON, B_AES_256, T);
1006 add("TLS_DH_anon_WITH_AES_256_CBC_SHA",
1007 0x003a, --p, K_DH_ANON, B_AES_256, N);
1008
1009 add("TLS_DH_anon_WITH_AES_128_CBC_SHA256",
1010 0x006c, --p, K_DH_ANON, B_AES_128, N, max, tls12, P_SHA256);
1011 add("TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
1012 0xC018, --p, K_ECDH_ANON, B_AES_128, T);
1013 add("TLS_DH_anon_WITH_AES_128_CBC_SHA",
1014 0x0034, --p, K_DH_ANON, B_AES_128, N);
1015
1016 add("TLS_ECDH_anon_WITH_RC4_128_SHA",
1017 0xC016, --p, K_ECDH_ANON, B_RC4_128, N);
1018 add("SSL_DH_anon_WITH_RC4_128_MD5",
1019 0x0018, --p, K_DH_ANON, B_RC4_128, N);
1020
1021 add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
1022 0xC017, --p, K_ECDH_ANON, B_3DES, T);
1023 add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA",
1024 0x001b, --p, K_DH_ANON, B_3DES, N);
1025
1026 add("TLS_RSA_WITH_NULL_SHA256",
1027 0x003b, --p, K_RSA, B_NULL, N, max, tls12, P_SHA256);
1028 add("TLS_ECDHE_ECDSA_WITH_NULL_SHA",
1029 0xC006, --p, K_ECDHE_ECDSA, B_NULL, N);
1030 add("TLS_ECDHE_RSA_WITH_NULL_SHA",
1031 0xC010, --p, K_ECDHE_RSA, B_NULL, N);
1032 add("SSL_RSA_WITH_NULL_SHA",
1033 0x0002, --p, K_RSA, B_NULL, N);
1034 add("TLS_ECDH_ECDSA_WITH_NULL_SHA",
1035 0xC001, --p, K_ECDH_ECDSA, B_NULL, N);
1036 add("TLS_ECDH_RSA_WITH_NULL_SHA",
1037 0xC00B, --p, K_ECDH_RSA, B_NULL, N);
1038 add("TLS_ECDH_anon_WITH_NULL_SHA",
1039 0xC015, --p, K_ECDH_ANON, B_NULL, N);
1040 add("SSL_RSA_WITH_NULL_MD5",
1041 0x0001, --p, K_RSA, B_NULL, N);
1042
1043
1044 add("SSL_RSA_WITH_DES_CBC_SHA",
1045 0x0009, --p, K_RSA, B_DES, N, tls12);
1046 add("SSL_DHE_RSA_WITH_DES_CBC_SHA",
1047 0x0015, --p, K_DHE_RSA, B_DES, N, tls12);
1048 add("SSL_DHE_DSS_WITH_DES_CBC_SHA",
1049 0x0012, --p, K_DHE_DSS, B_DES, N, tls12);
1050 add("SSL_DH_anon_WITH_DES_CBC_SHA",
1051 0x001a, --p, K_DH_ANON, B_DES, N, tls12);
1052
1053
1054 add("SSL_RSA_EXPORT_WITH_RC4_40_MD5",
1055 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11);
1056 add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
1057 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11);
1058
1059 add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
1060 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11);
1061 add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
1062 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11);
1063 add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
1064 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11);
1065 add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
1066 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11);
1067
1068
1069 add("TLS_KRB5_WITH_RC4_128_SHA",
1070 0x0020, --p, K_KRB5, B_RC4_128, N);
1071 add("TLS_KRB5_WITH_RC4_128_MD5",
1072 0x0024, --p, K_KRB5, B_RC4_128, N);
1073 add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA",
1074 0x001f, --p, K_KRB5, B_3DES, N);
1075 add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5",
1076 0x0023, --p, K_KRB5, B_3DES, N);
1077 add("TLS_KRB5_WITH_DES_CBC_SHA",
1078 0x001e, --p, K_KRB5, B_DES, N, tls12);
1079 add("TLS_KRB5_WITH_DES_CBC_MD5",
1080 0x0022, --p, K_KRB5, B_DES, N, tls12);
1081 add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
1082 0x0028, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11);
1083 add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
1084 0x002b, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11);
1085 add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA",
1086 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11);
1087 add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5",
1088 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11);
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106 add("SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5", 0x0006);
1107 add("SSL_RSA_WITH_IDEA_CBC_SHA", 0x0007);
1108 add("SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", 0x000b);
1109 add("SSL_DH_DSS_WITH_DES_CBC_SHA", 0x000c);
1110 add("SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA", 0x000d);
1111 add("SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", 0x000e);
1112 add("SSL_DH_RSA_WITH_DES_CBC_SHA", 0x000f);
1113 add("SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA", 0x0010);
1114
1115
1116 add("SSL_FORTEZZA_DMS_WITH_NULL_SHA", 0x001c);
1117 add("SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA", 0x001d);
1118
1119
1120 add("SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA", 0x0062);
1121 add("SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA", 0x0063);
1122 add("SSL_RSA_EXPORT1024_WITH_RC4_56_SHA", 0x0064);
1123 add("SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA", 0x0065);
1124 add("SSL_DHE_DSS_WITH_RC4_128_SHA", 0x0066);
1125
1126
1127
1128 add("NETSCAPE_RSA_FIPS_WITH_3DES_EDE_CBC_SHA", 0xffe0);
1129 add("NETSCAPE_RSA_FIPS_WITH_DES_CBC_SHA", 0xffe1);
1130 add("SSL_RSA_FIPS_WITH_DES_CBC_SHA", 0xfefe);
1131 add("SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA", 0xfeff);
1132
1133
1134 add("TLS_KRB5_WITH_IDEA_CBC_SHA", 0x0021);
1135 add("TLS_KRB5_WITH_IDEA_CBC_MD5", 0x0025);
1136 add("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA", 0x0027);
1137 add("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5", 0x002a);
1138
1139
1140 add("TLS_RSA_WITH_SEED_CBC_SHA", 0x0096);
1141 add("TLS_DH_DSS_WITH_SEED_CBC_SHA", 0x0097);
1142 add("TLS_DH_RSA_WITH_SEED_CBC_SHA", 0x0098);
1143 add("TLS_DHE_DSS_WITH_SEED_CBC_SHA", 0x0099);
1144 add("TLS_DHE_RSA_WITH_SEED_CBC_SHA", 0x009a);
1145 add("TLS_DH_anon_WITH_SEED_CBC_SHA", 0x009b);
1146
1147
1148 add("TLS_PSK_WITH_RC4_128_SHA", 0x008a);
1149 add("TLS_PSK_WITH_3DES_EDE_CBC_SHA", 0x008b);
1150 add("TLS_PSK_WITH_AES_128_CBC_SHA", 0x008c);
1151 add("TLS_PSK_WITH_AES_256_CBC_SHA", 0x008d);
1152 add("TLS_DHE_PSK_WITH_RC4_128_SHA", 0x008e);
1153 add("TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA", 0x008f);
1154 add("TLS_DHE_PSK_WITH_AES_128_CBC_SHA", 0x0090);
1155 add("TLS_DHE_PSK_WITH_AES_256_CBC_SHA", 0x0091);
1156 add("TLS_RSA_PSK_WITH_RC4_128_SHA", 0x0092);
1157 add("TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA", 0x0093);
1158 add("TLS_RSA_PSK_WITH_AES_128_CBC_SHA", 0x0094);
1159 add("TLS_RSA_PSK_WITH_AES_256_CBC_SHA", 0x0095);
1160
1161
1162 add("TLS_PSK_WITH_NULL_SHA", 0x002c);
1163 add("TLS_DHE_PSK_WITH_NULL_SHA", 0x002d);
1164 add("TLS_RSA_PSK_WITH_NULL_SHA", 0x002e);
1165
1166
1167 add("TLS_DH_DSS_WITH_AES_128_CBC_SHA", 0x0030);
1168 add("TLS_DH_RSA_WITH_AES_128_CBC_SHA", 0x0031);
1169 add("TLS_DH_DSS_WITH_AES_256_CBC_SHA", 0x0036);
1170 add("TLS_DH_RSA_WITH_AES_256_CBC_SHA", 0x0037);
1171 add("TLS_DH_DSS_WITH_AES_128_CBC_SHA256", 0x003e);
1172 add("TLS_DH_RSA_WITH_AES_128_CBC_SHA256", 0x003f);
1173 add("TLS_DH_DSS_WITH_AES_256_CBC_SHA256", 0x0068);
1174 add("TLS_DH_RSA_WITH_AES_256_CBC_SHA256", 0x0069);
1175
1176
1177 add("TLS_RSA_WITH_AES_128_GCM_SHA256", 0x009c);
1178 add("TLS_RSA_WITH_AES_256_GCM_SHA384", 0x009d);
1179 add("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", 0x009e);
1180 add("TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", 0x009f);
1181 add("TLS_DH_RSA_WITH_AES_128_GCM_SHA256", 0x00a0);
1182 add("TLS_DH_RSA_WITH_AES_256_GCM_SHA384", 0x00a1);
1183 add("TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", 0x00a2);
1184 add("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", 0x00a3);
1185 add("TLS_DH_DSS_WITH_AES_128_GCM_SHA256", 0x00a4);
1186 add("TLS_DH_DSS_WITH_AES_256_GCM_SHA384", 0x00a5);
1187 add("TLS_DH_anon_WITH_AES_128_GCM_SHA256", 0x00a6);
1188 add("TLS_DH_anon_WITH_AES_256_GCM_SHA384", 0x00a7);
1189
1190
1191 add("TLS_PSK_WITH_AES_128_GCM_SHA256", 0x00a8);
1192 add("TLS_PSK_WITH_AES_256_GCM_SHA384", 0x00a9);
1193 add("TLS_DHE_PSK_WITH_AES_128_GCM_SHA256", 0x00aa);
1194 add("TLS_DHE_PSK_WITH_AES_256_GCM_SHA384", 0x00ab);
1195 add("TLS_RSA_PSK_WITH_AES_128_GCM_SHA256", 0x00ac);
1196 add("TLS_RSA_PSK_WITH_AES_256_GCM_SHA384", 0x00ad);
1197 add("TLS_PSK_WITH_AES_128_CBC_SHA256", 0x00ae);
1198 add("TLS_PSK_WITH_AES_256_CBC_SHA384", 0x00af);
1199 add("TLS_PSK_WITH_NULL_SHA256", 0x00b0);
1200 add("TLS_PSK_WITH_NULL_SHA384", 0x00b1);
1201 add("TLS_DHE_PSK_WITH_AES_128_CBC_SHA256", 0x00b2);
1202 add("TLS_DHE_PSK_WITH_AES_256_CBC_SHA384", 0x00b3);
1203 add("TLS_DHE_PSK_WITH_NULL_SHA256", 0x00b4);
1204 add("TLS_DHE_PSK_WITH_NULL_SHA384", 0x00b5);
1205 add("TLS_RSA_PSK_WITH_AES_128_CBC_SHA256", 0x00b6);
1206 add("TLS_RSA_PSK_WITH_AES_256_CBC_SHA384", 0x00b7);
1207 add("TLS_RSA_PSK_WITH_NULL_SHA256", 0x00b8);
1208 add("TLS_RSA_PSK_WITH_NULL_SHA384", 0x00b9);
1209
1210
1211 add("TLS_RSA_WITH_CAMELLIA_128_CBC_SHA", 0x0041);
1212 add("TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA", 0x0042);
1213 add("TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA", 0x0043);
1214 add("TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", 0x0044);
1215 add("TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", 0x0045);
1216 add("TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA", 0x0046);
1217 add("TLS_RSA_WITH_CAMELLIA_256_CBC_SHA", 0x0084);
1218 add("TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA", 0x0085);
1219 add("TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA", 0x0086);
1220 add("TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", 0x0087);
1221 add("TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", 0x0088);
1222 add("TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA", 0x0089);
1223 add("TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0x00ba);
1224 add("TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256", 0x00bb);
1225 add("TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0x00bc);
1226 add("TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256", 0x00bd);
1227 add("TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0x00be);
1228 add("TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256", 0x00bf);
1229 add("TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0x00c0);
1230 add("TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256", 0x00c1);
1231 add("TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0x00c2);
1232 add("TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", 0x00c3);
1233 add("TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0x00c4);
1234 add("TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256", 0x00c5);
1235
1236
1237 add("TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA", 0xc01a);
1238 add("TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", 0xc01b);
1239 add("TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", 0xc01c);
1240 add("TLS_SRP_SHA_WITH_AES_128_CBC_SHA", 0xc01d);
1241 add("TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA", 0xc01e);
1242 add("TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA", 0xc01f);
1243 add("TLS_SRP_SHA_WITH_AES_256_CBC_SHA", 0xc020);
1244 add("TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA", 0xc021);
1245 add("TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA", 0xc022);
1246
1247
1248 add("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", 0xc02b);
1249 add("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 0xc02c);
1250 add("TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", 0xc02d);
1251 add("TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", 0xc02e);
1252 add("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 0xc02f);
1253 add("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 0xc030);
1254 add("TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", 0xc031);
1255 add("TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", 0xc032);
1256
1257
1258 add("TLS_ECDHE_PSK_WITH_RC4_128_SHA", 0xc033);
1259 add("TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA", 0xc034);
1260 add("TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", 0xc035);
1261 add("TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", 0xc036);
1262 add("TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256", 0xc037);
1263 add("TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384", 0xc038);
1264 add("TLS_ECDHE_PSK_WITH_NULL_SHA", 0xc039);
1265 add("TLS_ECDHE_PSK_WITH_NULL_SHA256", 0xc03a);
1266 add("TLS_ECDHE_PSK_WITH_NULL_SHA384", 0xc03b);
1267 }
1268
1269
1270 final static CipherSuite C_NULL = CipherSuite.valueOf(0, 0);
1271
1272
1273 final static CipherSuite C_SCSV = CipherSuite.valueOf(0x00, 0xff);
1274 }